package veterinario;

import java.io.Serializable;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.GregorianCalendar;

/** Classe que define o internamento de um animal na clínica, com uma data de início (_dataf na classe Consulta será o último dia de internamento) e uma variável finalized para saber se o internamento já acabou ou não.
 *
 * @author 2011101993 - Hugo Amaro
 * @author 2006130415 - Jorge Martins Alves
 */
public class Internamento extends Consulta implements Cobravel, Serializable {
	private GregorianCalendar _datai;
        private boolean finalized;

        /** Construtor que recebe 4 parâmetros: data de início do internamento, descrição do problema, o objeto com os dados do animal e a lista dos médicos.
         * 
         * @param data  data de início do internamento no formato gregorianCalendar.
         * @param desc  texto com descrição do internamento, como o problema do animal e o tratamento.
         * @param doente    objeto da classe Animal com todas as características que o definem.
         * @param medicos   lista com os médicos que participaram na consulta.
         */
        public Internamento(GregorianCalendar data, String desc, Animal doente, ArrayList<Medico> medicos){
            super(data,desc,doente,medicos);
            setDatai(getDataf());
            setDataf(null);
            finalized = false;
        }

        /** Método set para definir se a consulta já acabou ou não.
         * 
         * @param fin   boolean com o valor true se a consulta tiver acabado, ou false caso contrário.
         */
        public void setFinalized(boolean fin){
            this.finalized = fin;
        }

        /** Método set para definir a data de início do internamento.
         * 
         * @param aDatai    data de início do internamento de acordo com a classe GregorianCalendar.
         */
        final public void setDatai(GregorianCalendar aDatai) {
		this._datai = aDatai;
	}

        /** Método get que devolve a data de início do internamento.
         * 
         * @return     data de início do internamento.
         */
        public GregorianCalendar getDatai() {
		return this._datai;
	}

        /** Método usado para saber se o internamento já acabou ou não.
         * 
         * @return  true se já acabou, false caso contrário.
         */
        public boolean isFinalized(){
            return this.finalized;
        }

        /** Método que devolve uma String com informação sobre o internamento.
         * 
         * @return  texto com data de internamento (e data de fim se já tiver acabado), identificador único e raça do animal atendido, os médicos e o custo do atendimento.
         */
        @Override
        public String listaString(){
            SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
            String outStr = "";
            String medicos = "";
            for(int i=0; i<this.getMedicos().size(); i++){
                medicos += this.getMedicos().get(i).getNome();
                if(i<this.getMedicos().size()-1)
                    medicos += ", ";
                        }
            if(this.isFinalized())
                outStr += "DataI: "+dateFormat.format(this.getDatai().getTime()).toString()+" DataF: "+dateFormat.format(this.getDataf().getTime()).toString()+" Animal[ Id:"+this.getAnimal().getId()+" Raca:"+this.getAnimal().getRaca()+"] Medicos["+medicos+"] Valor: € "+this.custo();
            else
                outStr += "DataI: "+dateFormat.format(this.getDatai().getTime()).toString()+" Animal[ Id:"+this.getAnimal().getId()+" Raca:"+this.getAnimal().getRaca()+"] Medicos["+medicos+"] Valor: € "+this.custo();
            return outStr;
        }


        /** Compara consultas com internamentos e consultas, pela data.
         * 
         * @param Outro internamento ou uma consulta com o qual comparar.
         * @return  -1 se this é anterior ao evento dado como argumento, 0 se igual, e 1 se posterior
         */
        @Override
        public int compareTo(Object o){
            if(o.getClass() == Consulta.class){
                return this.getDataf().compareTo(((Consulta)o).getDataf());
            }else if(o.getClass() == Internamento.class){
                if(this.getDataf()!=null&&((Internamento)o).getDataf()!=null)
                    return this.getDataf().compareTo(((Internamento)o).getDataf());
                else if(this.getDataf()!=null&&((Internamento)o).getDataf()==null)
                    return this.getDataf().compareTo(((Internamento)o).getDatai());
                else if(this.getDataf()==null&&((Internamento)o).getDataf()!=null)
                    return this.getDatai().compareTo(((Internamento)o).getDataf());
                else
                    return this.getDatai().compareTo(((Internamento)o).getDatai());
            }
            return 0;
        }
}